#!/usr/bin/env python
# (C) 2000 Huaiyu Zhu <hzhu@users.sourceforge.net>.  Licence: GPL
# $Id: Scalar.py,v 1.4 2000/07/26 20:58:27 hzhu Exp $
"""
Scalar class in association with Matrix class.
It behaves like a number, but allows operations such as shape and typecode.

Providing a Scalar class is very inefficient.
It is, however, necessary because of the qirks of Numeric:
 o matrixmultiply (scalar, matrix) is transposed
 o Sometimes it is necessary to use .shape on scalars

"""

from MatPy import ScalarType
from MatPy.Matrix import Matrix
import MLab

#------------------------------------------------------------------
class Scalar(ScalarType):
	"class Scalar : class of numbers with customizable formats"
	
	def __init__(self, data):
		if isinstance(data, Matrix):
			if self.shape != (1,1):
				raise ValueError, "Can't change matrix of %dx%d to Scalar" % self.shape
			else:
				self.data = data[0]
		else:	self.data = data
		self.shape = (1, 1)
		self.typecode = MLab.array(self.data).typecode()

	def __add__(self, other): return self.data + other
	def __radd__(self, other): return other + self.data
	def __sub__(self, other): return self.data - other
	def __rsub__(self, other): return other - self.data
	def __mul__(self, other): return self.data * other
	def __rmul__(self, other): return other * self.data
	def __div__(self, other): return self.data / other
	def __rdiv__(self, other): return other / self.data
	def __cmp__(self, other):
		if self.data < other: return -1
		elif self.data == other: return 0
		else: return 1
	def __int__(self):		return int(self.data)
	def __float__(self):		return float(self.data)
